<?php
/**
 * 上传产品时需要根据商品分类验证不同的
 *
 * @author Zeon <scplay@gmail.com>
 * @date 2018/9/7 10:47
 * @copyright PanxSoft Inc.
 */

namespace App\Http\Requests\Concerns;


use App\Models\Panx\Category;
use App\Models\Panx\Product;
use App\Models\Panx\ProductUrlType;
use App\Models\Panx\Sex;
use Illuminate\Database\Query\Builder;
use Illuminate\Validation\Rule;

trait ProductRule
{
    /**
     * 与产品分类关联的规则
     *
     * @param int|null $category_id
     *
     * @return array
     */
    private function categoryRelateRules(?int $category_id): array
    {
        if (! $category_id) return [];

        if (Category::hasAsset($category_id)) {
            // 化妆品
            return [
                // 如果写 min:0 会导致前端提交 0 通过检查
                'brand_series_id'      => 'required|int|min:1', // 品牌系列 R
                'cosmetic_material_id' => 'nullable|int|min:0', // 材质
                'asset_id'             => 'nullable|int|min:0', // 模型文件
            ];
        } else {
            // 护肤品
            return [
                'product_tag_ids'     => 'required|array',  // 标签 R
                'product_tag_ids.*'   => 'required|int|min:1',
//                'body_position_ids'   => 'required|array',  // 身体部位 R
//                'body_position_ids.*' => 'required|int|min:1',
                'sex'                 => ['required', 'int', Rule::in(Sex::allSex())], // 性别 R
            ];
        }
    }

    /**
     * 产品外链网址参数验证规则
     *
     * @return array
     */
    private function urlRules(): array
    {
        // 新增时为 null，修改时数据库变成 0，前端如果不修改，这里需要跳过，否则会报 product_url 格式不正确
        if ((int) $this->product_url_type_id === ProductUrlType::ID_NO) {
            return [];
        }

        return [
            'product_url_type_id' => [
                'nullable', 'int', Rule::in((new ProductUrlType)->pluck('id'))
            ],
            'product_url'         => [
                // product_url 必须有 nullable，不然前端不传 product_url_type_id，product_url 传个空值过来无法通过验证
                'required_with:product_url_type_id', 'nullable', 'url', 'max:' . self::MAX_URL
            ],
        ];
    }

    /**
     * 新增产品图片
     *
     * @return array
     */
    private function thumbStoreRules(): array
    {
        return [
            'thumb'               => 'required|file|max:2048',
            'color_thumb'         => 'nullable|file|max:2048',
        ];
    }

    /**
     * 修改产品图片
     *
     * @return array
     */
    private function thumbUpdateRules(): array
    {
        return [
            'thumb'               => 'nullable|file|max:2048',
            'color_thumb'         => 'nullable|file|max:2048',
        ];
    }

    /**
     * @param $customer_id
     *
     * @return \Illuminate\Validation\Rules\Unique
     */
    private function ruleCustomerUnique(int $customer_id)
    {
        return Rule::unique((new Product)->getTable())
            ->where(function (Builder $query) use ($customer_id) {
                return $query->where('customer_id', $customer_id);
            });
    }

    /**
     * @return array
     */
    private function skuRules(): array
    {
        return [
            'product_mod_id'      => 'nullable|int|min:0',

            'product_skus'                    => 'nullable|array',
            'product_skus.*.spec_value_ids'   => 'required|array',
            'product_skus.*.spec_value_ids.*' => 'required|int|min:1',
            'product_skus.*.sell_price'       => 'required|numeric',
            'product_skus.*.thumb'            => 'nullable|string|min:2', // 网址 or key
            'product_skus.*.sku_code'         => 'required|string',

            'attribute_values'         => 'nullable|array', // attribute_values 的 id 数组
            'attribute_values.*.id'    => 'required|int|min:0',
            'attribute_values.*.value' => 'nullable|string|min:1',

            'spec_values'         => 'nullable|array', // spec_values 的 id 数组
            'spec_values.*.id'    => 'required|int|min:0',
            'spec_values.*.value' => 'nullable|string|min:1',
            'spec_values.*.thumb' => 'nullable|string|min:1',
        ];
    }

    /**
     * 从有赞同步来的商品 在更新时不检查外链地址，由后台自动请求有赞开放平台授权获取购买地址
     * @param array $urlRules
     *
     * @return array
     */
    protected function normalizeYouZanProductUrlUpdateRule(array $urlRules)
    {
        $url_type_id =  (int) $this->product_url_type_id;
        if ($url_type_id === ProductUrlType::ID_YOUZAN) {
            $product_id = last($this->segments());
            $product = (new Product)->find($product_id);

            if ($product && $product->youzan_item_id) {
                $urlRules['product_url'] = 'nullable';
            }
        }

        return $urlRules;
    }
}